//################################################################################
// MIT License
// Copyright (c) 2024 ZhangYihua
//
// Change Logs:
// Date           Author       Notes
// 2020-12-12     ZhangYihua   first version
//
// Description  : 
//################################################################################

module cic_intg_n #(
parameter           IDW                     = 12,
parameter           N                       = 5,
parameter           RM                      = 16,

// the following parameters are calculated automatically
parameter           ODW                     = IDW+N*$clog2(RM)
) ( 
input                                       rst_n,
input                                       clk,
input                                       cke,

input               [IDW-1:0]               id,

output              [ODW-1:0]               od
);

//################################################################################
// define local varialbe and localparam
//################################################################################
wire                [ODW-1:0]               td[N-1:0];

//################################################################################
// main
//################################################################################

cic_intg #(
        .IDW                            (IDW                            ),
        .ODW                            (ODW                            )
) u_cic_intg0 ( 
        .rst_n                          (rst_n                          ),
        .clk                            (clk                            ),
        .cke                            (cke                            ),

        .id                             (id                             ),
        .od                             (td[0]                          )
);

genvar g0;
generate for (g0=1; g0<N; g0=g0+1) begin:G_N
    cic_intg #(
        .IDW                            (ODW                            ),
        .ODW                            (ODW                            )
    ) u_cic_intg ( 
        .rst_n                          (rst_n                          ),
        .clk                            (clk                            ),
        .cke                            (cke                            ),

        .id                             (td[g0-1]                       ),
        .od                             (td[g0]                         )
    );
end endgenerate

assign od = td[N-1];

//################################################################################
// ASSERTION
//################################################################################

`ifdef CBB_ASSERT_ON
// synopsys translate_off


// synopsys translate_on
`endif

endmodule
